package com.youlu.campus.service.visitor;

import com.youlu.campus.base.exception.BusinessException;
import com.youlu.campus.entity.UserPO;
import com.youlu.campus.entity.VO.req.CheckMobileVO;
import com.youlu.campus.entity.VO.res.VisitorUserInfoRes;
import org.springframework.scheduling.annotation.Async;

import java.util.Date;
import java.util.HashMap;
import java.util.List;

public interface VisitorUserService {
    /**
     * 获取用户信息
     *
     * @param platform
     * @param appId
     * @param openId
     * @return
     */
    UserPO getUser(String platform, String appId, String openId);

    UserPO getUserUserId(String platform, String appId, String userId);

    /**
     * 根据平台与用户id 获取用户信息
     *
     * @param platform
     * @param userId
     * @return
     */
    UserPO getUserByPlatformAndUserId(String platform, String userId);

    /**
     * 获取用户
     */
    UserPO getUserByOpenId(String openId);

    /**
     * 获取C端用户信息
     *
     * @param userId
     * @return
     * @throws BusinessException
     */
    UserPO getUser(String userId) throws BusinessException;

    /**
     * 获取C端用户信息
     *
     * @param userId
     * @return
     */
    VisitorUserInfoRes getVisitorUerInfo(String userId, UserPO po);

    /**
     * 更新用户信息
     */
    @Async
    void save(UserPO userPO);

    /**
     * 更新用户步数
     *
     * @param userId
     * @param date
     * @param step
     * @return
     */
    @Async
    void updateMovementStep(String userId, Date date, Integer step);

    /**
     * 获取用户步数
     *
     * @param userId
     * @param date
     * @return
     */
    Integer getMovemeStep(String userId, Date date);

    /**
     * 更新用户信息
     *
     * @param userInfo
     */
    void updateUser(UserPO userInfo);


    HashMap<String, UserPO> getByUserIds(List<String> ids);

    /**
     * 根据平台和手机号获取用户
     */
    UserPO findUser(String mobile, String platform, String appId);

    /**
     * 获取用户所在省
     */
    String getUserProvince(String acitivityId, String userId);

    /**
     * 账户是否验证手机号
     *
     * @param userId
     * @return
     */
    boolean checkedMobile(String userId);

    /**
     * 更新账户手机号验证
     *
     * @param id
     * @param mobile
     */
    void updateAccountMobile(String id, String mobile);


    /**
     * 通过手机号查询
     *
     * @param mobile
     * @param checkMobile
     * @return
     */
    UserPO find(String mobile, Boolean checkMobile);

    /**
     * 查询相同手机号关联用户
     *
     * @param mobile
     * @return
     */
    List<String> findCorrentMobileUserId(String mobile);

    /**
     * 查询相关的用户ID
     *
     * @param userId
     * @return
     */
    List<String> findCorrentUserId(String userId);

    List<String> findSameMobiles(String userId);

    UserPO find(String mobile);

    /**
     * 通过小程序openId查询
     *
     * @param miniOpenId
     * @return
     */
    UserPO findByMiniOpenId(String miniOpenId);

    /**
     * 创建用户
     *
     * @param req
     * @return
     */
    UserPO createUser(CheckMobileVO req);


    /**
     * 查找相关联的用户ID
     *
     * @param activityId
     * @param userId
     * @return
     */
    List<String> findCorrentUsers(String activityId, String userId);

    /**
     * 通过账户ID和平台查询用户
     *
     * @param userId
     * @param platform
     * @return
     */
    UserPO find(String userId, String platform);

    /**
     * 获取默认用户
     *
     * @return
     */
    UserPO getDefaultUser();


    HashMap<String, UserPO> getByUserIdsAndPlatform(List<String> ids, String platform, String appId);

    /**
     * 获取用户所在省
     *
     * @param userPO
     * @param activityId
     * @return
     */
    String getUserProvince(UserPO userPO, String activityId);


    boolean updateUserPo(UserPO userPO, String platform, String appId);


    String userUniversityId(String userId, String activityId);

    /**
     * 小程序更新保存
     *
     * @param updateUser
     * @return
     */
    UserPO saveOrUpdate(UserPO updateUser);

    UserPO findUserByUserId(String userId);
}
